{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "ein.tags": "worksheet-0",
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "# 推荐系统实验方法\n",
    "什么才是好的推荐系统？\n",
    "\n",
    "一个完整的推荐系统一般存在3个参与方： **用户** 、 **物品提供者** 和 **提供推荐系统的网站** 。\n",
    "\n",
    "![img](../recsys_images/recsys_participants.png)\n",
    "\n",
    "考虑三方利益，实现共赢：\n",
    "\n",
    "1.  需要满足用户的需求，给用户推荐那些令其感兴趣的物品\n",
    "2.  要让所有物品提供者的物品都能够被推荐给对其感兴趣的用户\n",
    "3.  能够收集到高质量的用户反馈，不断完善推荐的质量，增加用户和网站的交互，提高网站收入\n",
    "\n",
    "**预测准确度是推荐系统领域的重要指标（没有之一）。** 其可以比较容易地通过离线方式计算出来，从而方便研究人员快速评价和选择不同的推荐算法。\n",
    "\n",
    "**准确的预测并不代表好的推荐。**\n",
    "\n",
    "好的推荐系统不仅 **能够准确预测用户的行为，而且能够扩展用户的视野，帮助用户发现那些他们可能会感兴趣，但却不那么容易发现的东西。** 同时，推荐系统还要能够帮助商家将那些被埋没在长尾中的好商品介绍给可能会对它们感兴趣的用户。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ein.tags": "worksheet-0",
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "<a id=\"org6bf97bd\"></a>\n",
    "## 离线实验\n",
    "\n",
    "1.  通过日志系统获得用户行为数据，并按照一定格式生成一个标准的数据集；\n",
    "2.  将数据集按照一定的规则分成训练集和测试集；\n",
    "3.  在训练集上训练用户兴趣模型，在测试集上进行预测；\n",
    "4.  通过事先定义的离线指标评测算法在测试集上的预测结果。\n",
    "\n",
    "**不需要实际的系统来供它实验，而只要有一个从实际系统日志中提取的数据集即可。**\n",
    "\n",
    "| 优点                             | 缺点                             |\n",
    "|----------------------------------|----------------------------------|\n",
    "| 不需要用户参与实验               | 无法计算商业上关心的指标         |\n",
    "| 速度快，可以测试大量算法         | 离线实验的指标和商业指标存在差距 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ein.tags": "worksheet-0",
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "<a id=\"org71e8c2f\"></a>\n",
    "## 用户调查\n",
    "\n",
    "注意：预测准确率和用户满意度之间可能存在很大差别，高预测准确率不等于高用户满意度。\n",
    "\n",
    "用户调查需要一些真实用户，让其在需要测试的推荐系统上完成一些任务。在其完成任务时，观察和记录他们的行为，并让他们回答一些问题。最后，通过分析其行为和答案了解测试系统的性能。\n",
    "\n",
    "**用户调查是推荐系统评测的一个重要工具，很多离线没有办法评测的与用户主观感受有关的指标都可以通过用户调查获得，相对在线实验风险很低，出现错误后很容易弥补。**\n",
    "\n",
    "**用户调查的缺点：**\n",
    "\n",
    "-   成本高，需要用户花大量时间完成一个个任务并回答相关问题，有时需要花钱雇用测试用户\n",
    "-   大多数情况下很难进行大规模的用户调查，对于参加人数少的用户调查，很多结论往往没有统计意义\n",
    "\n",
    "开展用户调查：\n",
    "\n",
    "针对其缺点， **在做用户调查时，一方面要控制成本，另一方面又要保证结果的统计意义。**\n",
    "\n",
    "尽量保证测试用户的分布和真实用户的分布相同。\n",
    "\n",
    "尽量保证是 **双盲实验** 。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ein.tags": "worksheet-0",
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "<a id=\"org052b86e\"></a>\n",
    "## 在线实验\n",
    "\n",
    "将推荐系统上线做 **AB测试**<sup><a id=\"fnr.1\" class=\"footref\" href=\"#fn.1\">1</a></sup>，将其和旧的算法进行比较。\n",
    "\n",
    "AB测试可以公平获得不同算法实际在线时的性能指标（包括商业上关注的指标），但其周期比较长。一般只用来测试那些在离线实验和用户调查中表现很好的算法。\n",
    "\n",
    "**切分流量** 是AB测试的关键，一个网站不同的层以及控制这些层的团队需要从一个统一的地方获得自己AB测试的流量，不同层之间的流量应该是独立的。\n",
    "\n",
    "![img](../recsys_images/recsys_ab_test_system.png \"一个简单的AB测试系统\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ein.tags": "worksheet-0",
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "<a id=\"orga86aeff\"></a>\n",
    "## 总结\n",
    "\n",
    "一般来说，一个新的推荐算法最终上线，需要完成上面所说的3个实验。\n",
    "\n",
    "1.  通过离线实验证明它在很多离线指标上优于现有的算法；\n",
    "2.  通过用户调查确定它的用户满意度不低于现有的算法；\n",
    "3.  通过在线的AB测试确定它在我们关心的指标上优于现有的算法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ein.tags": "worksheet-0",
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "## 脚注\n",
    "\n",
    "<sup><a id=\"fn.1\" class=\"footnum\" href=\"#fnr.1\">1</a></sup> AB测试是一种很常用的在线评测算法的实验方法。它通过一定的规则将用户随机分成几组，并对不同组的用户采用不同的算法，然后通过统计不同组用户的各种不同的评测指标比较不同算法。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "name": "2-recsys-experimental-method.ipynb"
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
